package com.mh.controller;

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import com.mh.entity.Course;
import com.mh.service.CourseService;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.List;

@Controller
@RequestMapping("/course")
public class CourseController {
    
    @Autowired
    private CourseService cs;
    
    @RequestMapping("/findAll")
    public String findAll(Model model){ //Model封装了一个request作用域

        List<Course> all = cs.findAll();

        //request作用域中存储上面的集合
        model.addAttribute("courses", all);

        return "index";
    }

    //导入Excel-->存到数据库
    @RequestMapping("/importExcel") //前端: action="@{/course/importExcel}"
    /** MultipartFile excelFile 接收前端上传的 Excel 文件
     *  前端: enctype="multipart/form-data" ; 后端形参类型: MultipartFile
     *  前端: name="excelFile" ; 后端形参名: excelFile
     */
    public String importExcel(MultipartFile excelFile) throws Exception {
        //创建一个ImportParams对象params，这个对象通常用于配置Excel导入的参数
        ImportParams params = new ImportParams();
        params.setTitleRows(1); //Excel文件的第一行将被视为标题行
        params.setHeadRows(2); //Excel文件的前两行将被视为表头行

        /** ExcelImportUtil.importExcel方法 --> 将Excel文件的内容导入为一个Course对象的List里
         *  excelFile.getInputStream() 获取上传文件的输入流
         *  Course.class 指定了要将Excel数据映射到的Java类
         *  params 是之前配置的导入参数(设置标题行+表头行)
         *  导入的结果是一个List<Course>对象，存储在courses变量中
         */
        List<Course> courses = ExcelImportUtil.importExcel
                                (excelFile.getInputStream(), Course.class, params);

        //调用cs对象的save方法，将导入的courses列表保存到数据库中
        cs.save(courses);

        //Spring MVC重定向到/course/findAll路径，为了在导入完成后显示所有课程列表
        return "redirect:/course/findAll";
    }
    //导出到Excel
    @RequestMapping("/exportExcel") //前端: <a th:href="@{/course/exportExcel}">
    //接收一个HttpServletResponse类型的参数resp，用于设置HTTP响应内容
    public void exportExcel(HttpServletResponse resp) throws IOException {
        //查询全部课程信息
        //从数据库中获取所有课程信息，并将其存储在List<Course>类型的变量all中
        List<Course> all = cs.findAll();

        /** ExcelExportUtil.exportExcel方法将实体类导出为Excel文件
         *  ExportParams对象，用于配置导出参数-->设置标题,Sheet名
         *  Course.class 指定了要导出的Java类，Excel的列将根据Course类的字段生成
         *  all 是上面调用Service层查询到的数据库结果List
         *  导出的结果是一个Workbook对象（通常是HSSFWorkbook或XSSFWorkbook），表示Excel文件
         */
        Workbook sheets = ExcelExportUtil.exportExcel(
                                            new ExportParams("课程信息列表", "课程信息"),
                                            Course.class,
                                            all);

        /** 设置HTTP响应头，告诉浏览器这是一个附件，并指定文件名
         *  Content-Disposition 头的值为attachment;fileName=课程信息列表.xls，表示文件应作为附件下载
         *  URLEncoder.encode("课程信息列表.xls","UTF-8") 对文件名进行URL编码
         */
        resp.setHeader("Content-Disposition","attachament;fileName="
                            + URLEncoder.encode("课程信息列表.xls","UTF-8"));

        //获取HTTP响应的输出流os，用于将Excel文件写入响应
        ServletOutputStream os = resp.getOutputStream();
        //将Workbook对象（即Excel文件）写入输出流os，从而将文件发送给客户端
        sheets.write(os);

        os.close();
        sheets.close();
    }
}
